import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useAuthStore } from '../store/auth'

// 创建axios实例 封装发送对象
const instance = axios.create({
    // 请求路径前缀
    baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080',
    // 超时时间
    timeout: 10000,
    // 请求头信息
    headers: {
        'Content-Type': 'application/json;charset=UTF-8',
    },
    // 跨域配置
    withCredentials: true, // 允许携带cookie
})

// 请求拦截器
instance.interceptors.request.use(
    config => {
        // 获取token
        const authStore = useAuthStore()
        const token = authStore.token || localStorage.getItem('token')
        
        // 添加token到请求头
        if (token) {
            // 支持多种token格式
            config.headers['Authorization'] = `Bearer ${token}`
            // 兼容其他token格式
            config.headers['token'] = token
            config.headers['X-Access-Token'] = token
        }
        
        // 添加请求ID用于调试
        config.headers['X-Request-ID'] = Date.now().toString()
        
        // 处理不同的Content-Type
        if (config.data instanceof FormData) {
            config.headers['Content-Type'] = 'multipart/form-data'
        }
        
        console.log('请求拦截器:', {
            url: config.url,
            method: config.method,
            headers: config.headers,
            data: config.data
        })
        
        return config
    }, 
    error => {
        // 请求错误处理
        console.error('请求拦截器错误:', error)
        ElMessage.error('请求配置错误')
        return Promise.reject(error)
    }
)

// 响应拦截器
instance.interceptors.response.use(
    response => {
        // 响应拦截逻辑
        const { data, status } = response
        
        console.log('响应拦截器:', {
            status,
            data
        })
        
        // 统一处理响应格式
        if (status === 200) {
            // 后端返回的数据结构: { code, message, data }
            if (data.code !== undefined) {
                if (data.code === 200 || data.code === 0) {
                    return data.data || data
                } else if (data.code === 401) {
                    // token过期或无效
                    handleTokenExpired()
                    return Promise.reject(new Error(data.message || '登录已过期'))
                } else if (data.code === 403) {
                    // 权限不足
                    ElMessage.error(data.message || '权限不足')
                    return Promise.reject(new Error(data.message || '权限不足'))
                } else {
                    // 其他业务错误
                    ElMessage.error(data.message || '操作失败')
                    return Promise.reject(new Error(data.message || '操作失败'))
                }
            }
            return data
        }
        
        return response.data
    }, 
    error => {
        // 响应错误处理
        console.error('响应拦截器错误:', error)
        
        if (error.response) {
            const { status, data } = error.response
            
            switch (status) {
                case 401:
                    handleTokenExpired()
                    break
                case 403:
                    ElMessage.error('权限不足')
                    break
                case 404:
                    ElMessage.error('请求的资源不存在')
                    break
                case 500:
                    ElMessage.error('服务器内部错误')
                    break
                case 502:
                    ElMessage.error('网关错误')
                    break
                case 503:
                    ElMessage.error('服务不可用')
                    break
                default:
                    ElMessage.error(data?.message || `请求失败 (${status})`)
            }
        } else if (error.code === 'ECONNABORTED') {
            ElMessage.error('请求超时，请检查网络连接')
        } else if (error.message === 'Network Error') {
            ElMessage.error('网络错误，请检查网络连接')
        } else {
            ElMessage.error(error.message || '未知错误')
        }
        
        return Promise.reject(error)
    }
)

// 处理token过期
function handleTokenExpired() {
    const authStore = useAuthStore()
    ElMessage.warning('登录已过期，请重新登录')
    authStore.logout()
    
    // 跳转到登录页
    setTimeout(() => {
        window.location.href = '/login'
    }, 1000)
}

// 导出axios实例
export default instance

// 导出常用的请求方法
export const request = {
    get(url, params = {}) {
        return instance.get(url, { params })
    },
    
    post(url, data = {}) {
        return instance.post(url, data)
    },
    
    put(url, data = {}) {
        return instance.put(url, data)
    },
    
    delete(url, params = {}) {
        return instance.delete(url, { params })
    },
    
    upload(url, file, onProgress = () => {}) {
        const formData = new FormData()
        formData.append('file', file)
        
        return instance.post(url, formData, {
            headers: {
                'Content-Type': 'multipart/form-data'
            },
            onUploadProgress: onProgress
        })
    }
}